package whlogger.launcher.loginfields.views.behavior;

import java.awt.Color;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javax.swing.JTextField;

/**
 * @author d3rbastl3r
 */
public abstract class AbstractJTextFieldBehavior{
    public static final Color TEXT_COLOR_GRAY   = new Color(204, 204, 204);
    public static final Color TEXT_COLOR_BLACK  = new Color(0, 0, 0);
	
	public static final String PROPERTY_NAME_1	= "isActive";
    
    private boolean isActive = false;
    private PropertyChangeSupport changes = null;
	
	protected AbstractJTextFieldBehavior(){
		this.changes = new PropertyChangeSupport(this);
	}
	
    /**
     * Stellt die Standartwerte eines Textfeldes wieder her
     */
    public void doActivate(){
        if(this.isActive){
            return;
        }
        
        getJTextField().setText("");
        getJTextField().setForeground(TEXT_COLOR_BLACK);
        activateExtraAction();
		this.changes.firePropertyChange(PROPERTY_NAME_1, this.isActive, true);
		this.isActive = true;
    }
    
    protected void activateExtraAction(){}
    
    /**
     * Bereitet das Textfeld für eine Eingabe vor.
     */
    public void doDeactivate(){
        if(!getJTextField().getText().isEmpty()){
            return;
        }
        
        getJTextField().setText(getStandartText());
        getJTextField().setForeground(TEXT_COLOR_GRAY);
        deactivateExtraAction();
		this.changes.firePropertyChange(PROPERTY_NAME_1, this.isActive, false);
		this.isActive = false;
    }
	
	/**
	 * Gibt an ob das Component aktiv ist oder nicht.
	 * @return 
	 */
	public boolean isActive(){
		return this.isActive;
	}
	
	public void addPropertyChangeListener(PropertyChangeListener listener){
		this.changes.addPropertyChangeListener(listener);
	}

	public void removePropertyChangeListener(PropertyChangeListener listener){
		this.changes.removePropertyChangeListener(listener);
	}
    
    protected void deactivateExtraAction(){}
    
    /**
     * Liefert den Standarttext der bei einem deaktiviertem Textfeld
     * stehen soll.
     * @return String
     */
    abstract protected String getStandartText();
    
    /**
     * Liefert ein JTextField an dem die Standartaktion durchgeführt
     * werden soll.
     * @return JTextField
     */
    abstract protected JTextField getJTextField();
}
